unit dmprincipal;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, DB, FileUtil, ZConnection, ZDataset, Dialogs,
  ucondicoesconsulta, dmusuario;

{Usuário e senha para conexão com o banco de dados}
const
  DB_USER = 'postgres';
  DB_PASSWORD = 'postgres';

type

  { TDataPrincipal }

  TDataPrincipal = class(TDataModule)
    SourcePrincipal: TDatasource;
    ZConPrincipal: TZConnection;
    ZQueryPrincipal: TZQuery;
    procedure ConsultaCondicoes(ZQ: TZQuery; Tabela: string;
      Condicoes: TCondicoesConsulta);
    procedure ConsultaVazio(ZQ: TZQuery; Tabela: string);
    procedure DataModuleCreate(Sender: TObject);
    function Conecta(usuario: TDadosUsuario): boolean;
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  DataPrincipal: TDataPrincipal;

implementation

uses
  // Unit necessário para criação do arquivo de configuração
  IniFiles;

{$R *.lfm}

{ TDataPrincipal }
{procedimento de consultar no banco com as condições estabelecidas, passado
como parâmetro ZQ, tabela, e as condiçẽos pré-estabelecidas pelo usuário}
procedure TDataPrincipal.ConsultaCondicoes(ZQ: TZQuery; Tabela: string;
  Condicoes: TCondicoesConsulta);
begin
  ZQ.Close();
  ZQ.SQL.Clear();
  ZQ.SQL.Add('SELECT * FROM ' + Tabela);
  if condicoes.GetCount() > 0 then
  begin
    ZQ.SQL.Add('WHERE' + condicoes.getCondicoes());
  end;
  ZQ.Open();
end;

{Consulta inicial para abrir o ZQ desejado com a consulta específica de uma
tabela retornando LIMIT 0 para menor consumo de mémório}
procedure TDataPrincipal.ConsultaVazio(ZQ: TZQuery; Tabela: string);
begin
  ZQ.Close;
  ZQ.SQL.Clear();
  ZQ.SQL.Add('SELECT * FROM ' + Tabela);
  ZQ.SQL.Add('LIMIT 0');
  ZQ.Open();
end;

{Criação do Módulo de Dados}
procedure TDataPrincipal.DataModuleCreate(Sender: TObject);
var
  Arq: TIniFile;
begin
  {Verifica se já existe o arquivo de configuração}
  if not FileExists(GetAppConfigFile(False)) then
  begin
    // Se não existir cria o arquivo com as configurações padrões
    if not DirectoryExists(GetAppConfigDir(False)) then begin
      CreateDir(GetAppConfigDir(False));
    end;
    Arq := TIniFile.Create(GetAppConfigFile(False));
    Arq.WriteString('CONFIG', 'nomebanco', 'scats');
    Arq.WriteString('CONFIG', 'nomeservidor', 'localhost');
    Arq.Free;
  end;
end;

{Função que realiza a conexão com o banco de dados}
function TDataPrincipal.Conecta(usuario: TDadosUsuario): boolean;
var
  Arq: TIniFile;
  NomeServidor, NomeBanco: string;
begin
  try
    Arq := TIniFile.Create(GetAppConfigFile(False));
    ZConPrincipal.User := DB_USER;
    ZConPrincipal.Password := DB_PASSWORD;
    NomeServidor := Arq.ReadString('CONFIG', 'nomeservidor', 'localhost');
    ZConPrincipal.HostName := NomeServidor;
    NomeBanco := Arq.ReadString('CONFIG', 'nomebanco', 'scats');
    ZConPrincipal.Database := NomeBanco;
    ZConPrincipal.Connect();
    if DataUsuario.VerificaLogin(usuario) then
    begin
      Result := True;
    end;
  except
    Result := False;
  end;
end;

end.
